In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
import seaborn as sns
In [2]:
# Path ini tergantung pada drive mana yang digunakan
# Kasus kali ini menggunakan data yang berada di drive peneliti
data_path = '/content/drive/My Drive/Colab Notebooks/data/household_power_consumption/'
desc_path = '/content/drive/My Drive/Colab Notebooks/data/household_power_consumption/description.txt'
visdat_path = '/content/drive/My Drive/Colab Notebooks/visdat/household_power_consumption'
In [3]:
df = pd.read_csv(os.path.join(data_path,'household_power_consumption.txt'), sep = ';', dtype = 'object')

# Terdapat '?' pada nilai yang NA pada atribut (2,3,4,5,6,7), maka kita perlu ganti menjadi NA terlebih dahulu
for i in range(2,9):
  df.iloc[:,i] = df.iloc[:,i].replace('?',np.nan).astype('float64')

# Mari kita pecah variabel Date menjadi Year, Month, dan Day
dt = pd.DatetimeIndex(df.Date)

df['Year'] = dt.year.astype('category')
df['Month'] = dt.month.astype('category')
df['Day'] = dt.day.astype('category')

# Kemudian, kita hapus kolom Date
df = df.drop('Date', axis = 1)
del dt

df
Out[3]:
Time Global_active_power Global_reactive_power Voltage Global_intensity Sub_metering_1 Sub_metering_2 Sub_metering_3 Year Month Day
0 17:24:00 4.216 0.418 234.84 18.4 0.0 1.0 17.0 2006 12 16
1 17:25:00 5.360 0.436 233.63 23.0 0.0 1.0 16.0 2006 12 16
2 17:26:00 5.374 0.498 233.29 23.0 0.0 2.0 17.0 2006 12 16
3 17:27:00 5.388 0.502 233.74 23.0 0.0 1.0 17.0 2006 12 16
4 17:28:00 3.666 0.528 235.68 15.8 0.0 1.0 17.0 2006 12 16
... ... ... ... ... ... ... ... ... ... ... ...
2075254 20:58:00 0.946 0.000 240.43 4.0 0.0 0.0 0.0 2010 11 26
2075255 20:59:00 0.944 0.000 240.00 4.0 0.0 0.0 0.0 2010 11 26
2075256 21:00:00 0.938 0.000 239.82 3.8 0.0 0.0 0.0 2010 11 26
2075257 21:01:00 0.934 0.000 239.70 3.8 0.0 0.0 0.0 2010 11 26
2075258 21:02:00 0.932 0.000 239.55 3.8 0.0 0.0 0.0 2010 11 26

2075259 rows × 11 columns

In [ ]:
# Deskripsi Data
with open(desc_path, 'r') as file:
  desc = file.read()
  print(desc)
___________________ABSTRACT_______________________
Abstract: Measurements of electric power consumption in one household with a one-minute sampling rate over 
a period of almost 4 years. Different electrical quantities and some sub-metering values are available.

___________________DESCRIPTION_______________________

This archive contains 2075259 measurements gathered in a house located in Sceaux (7km of Paris, France) 
between December 2006 and November 2010 (47 months).
Notes:
1.	(global_active_power*1000/60 - sub_metering_1 - sub_metering_2 - sub_metering_3) represents the active 
	energy consumed every minute (in watt hour) in the household by electrical equipment not measured in 
	sub-meterings 1, 2 and 3.
2.	The dataset contains some missing values in the measurements (nearly 1,25% of the rows). All calendar 
	timestamps are present in the dataset but for some timestamps, the measurement values are missing: 
	a missing value is represented by the absence of value between two consecutive semi-colon attribute 
	separators. For instance, the dataset shows missing values on April 28, 2007.

___________________ATTRIBUTES_______________________
1.	date: Date in format dd/mm/yyyy
2.	time: time in format hh:mm:ss
3.	global_active_power: household global minute-averaged active power (in kilowatt)
4.	global_reactive_power: household global minute-averaged reactive power (in kilowatt)
5.	voltage: minute-averaged voltage (in volt)
6.	global_intensity: household global minute-averaged current intensity (in ampere)
7.	sub_metering_1: energy sub-metering No. 1 (in watt-hour of active energy). It corresponds to the 
	kitchen, containing mainly a dishwasher, an oven and a microwave (hot plates are not electric but gas 
	powered).
8.	sub_metering_2: energy sub-metering No. 2 (in watt-hour of active energy). It corresponds to the 
	laundry room, containing a washing-machine, a tumble-drier, a refrigerator and a light.
9.	sub_metering_3: energy sub-metering No. 3 (in watt-hour of active energy). It corresponds to an 
	electric water-heater and an air-conditioner.
In [4]:
# Inisiasi variabel yang akan sering digunakan
month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']

Data Describing

In [24]:
df.describe(include = 'all')
Out[24]:
Time Global_active_power Global_reactive_power Voltage Global_intensity Sub_metering_1 Sub_metering_2 Sub_metering_3 Year Month Day
count 2075259 2.049280e+06 2.049280e+06 2.049280e+06 2.049280e+06 2.049280e+06 2.049280e+06 2.049280e+06 2075259.0 2075259.0 2075259.0
unique 1440 NaN NaN NaN NaN NaN NaN NaN 5.0 12.0 31.0
top 19:02:00 NaN NaN NaN NaN NaN NaN NaN 2008.0 10.0 1.0
freq 1442 NaN NaN NaN NaN NaN NaN NaN 527040.0 177120.0 69120.0
mean NaN 1.091615e+00 1.237145e-01 2.408399e+02 4.627759e+00 1.121923e+00 1.298520e+00 6.458447e+00 NaN NaN NaN
std NaN 1.057294e+00 1.127220e-01 3.239987e+00 4.444396e+00 6.153031e+00 5.822026e+00 8.437154e+00 NaN NaN NaN
min NaN 7.600000e-02 0.000000e+00 2.232000e+02 2.000000e-01 0.000000e+00 0.000000e+00 0.000000e+00 NaN NaN NaN
25% NaN 3.080000e-01 4.800000e-02 2.389900e+02 1.400000e+00 0.000000e+00 0.000000e+00 0.000000e+00 NaN NaN NaN
50% NaN 6.020000e-01 1.000000e-01 2.410100e+02 2.600000e+00 0.000000e+00 0.000000e+00 1.000000e+00 NaN NaN NaN
75% NaN 1.528000e+00 1.940000e-01 2.428900e+02 6.400000e+00 0.000000e+00 1.000000e+00 1.700000e+01 NaN NaN NaN
max NaN 1.112200e+01 1.390000e+00 2.541500e+02 4.840000e+01 8.800000e+01 8.000000e+01 3.100000e+01 NaN NaN NaN

Berapakah banyaknya sampel yang masuk dalam pendataan per bulan tiap tahunnya

In [25]:
data = pd.crosstab(df.Year,df.Month)
data.columns = month
data
Out[25]:
Jan Feb Mar Apr May June July Aug Sept Oct Nov Dec
Year
2006 0 0 0 0 0 0 0 0 0 0 0 21996
2007 44640 40320 44640 43200 44640 43200 44640 44640 43200 44640 43200 44640
2008 44640 41760 44640 43200 44640 43200 44640 44640 43200 44640 43200 44640
2009 44640 40320 44640 43200 44640 43200 44640 44640 43200 44640 43200 44640
2010 43200 38880 43200 41760 43200 41760 43200 43200 41760 43200 35823 15840

Apakah terdapat korelasi yang cukup kuat antara penggunaan daya untuk masing-masing alat

In [ ]:
fig, ax = plt.subplots(3,1,figsize = (12,18), dpi = 300)


ax[0].scatter(df.Sub_metering_1, df.Sub_metering_2, c = df.Sub_metering_1.values, cmap = 'viridis')
ax[0].set_xlabel('Kitchen Appliances')
ax[0].set_ylabel('Laundry Room Appliances')

ax[1].scatter(df.Sub_metering_1, df.Sub_metering_3, c = df.Sub_metering_1.values, cmap = 'magma')
ax[1].set_xlabel('Kitchen Appliances')
ax[1].set_ylabel('Air Conditioner and Water Heater')

ax[2].scatter(df.Sub_metering_2, df.Sub_metering_3, c = df.Sub_metering_2.values, cmap = 'plasma')
ax[2].set_xlabel('Laundry Room Appliances')
ax[2].set_ylabel('Air Conditioner and Water Heater')

for i in range(3):
  for spine in ['right', 'top']:
    ax[i].spines[spine].set_visible(False)

fig.suptitle('Korelasi antara penggunaan daya listrik\nuntuk masing-masing alat listrik\n(Kitchen,Laundry,Air and Water Heater)')
fig.tight_layout(pad = 4)
fig.savefig(os.path.join(visdat_path, 'corelation submeter'))
Output hidden; open in https://colab.research.google.com to view.

Bagaimana Persebaran Global_active_power dan Global_reactive_power

> Daya aktif adalah keseluruhan daya yang telah digunakan oleh alat-alat pada suatu rumah tangga. Dibandingkan dengan daya aktif, daya reaktif

Secara keseluruhan, kurang lebih daya yang digunakan oleh alat-alat rumah tangga selama 4 tahun (2006-2010) berkisar antara 0 hingga 2 kilowatt. Sedangkan daya reaktifnya berkisar kurang lebih 0 hingga 400 watt.

In [ ]:
fig, ax = plt.subplots(2,2, figsize = (15,10),dpi = 300)
sns.boxplot(
    x = df.Global_active_power[df.Global_active_power.notna()], 
    ax = ax[1][0], palette = 'magma'
)
sns.boxplot(
    x = df.Global_reactive_power[df.Global_reactive_power.notna()], 
    ax = ax[1][1], palette = 'magma'
)
sns.histplot(
    x = df.Global_active_power[df.Global_active_power.notna()], bins = 80, 
    element = 'bars', ax = ax[0][0]
)
sns.histplot(
    x = df.Global_reactive_power[df.Global_reactive_power.notna()], bins = 80, 
    element = 'bars', ax = ax[0][1]
)

fig.suptitle('Distribusi Daya Aktif (Kiri) dan Daya Reaktif (Kanan)', fontsize = 30)
fig.savefig(os.path.join(visdat_path, 'power_active_reactive_distribution'))

Bagaimana Persebaran Intensitas Listrik yang dikirim ke rumah tangga tersebut? (dalam Amphere)

In [11]:
fig, ax = plt.subplots(2,2, figsize = (15,10),dpi = 300)
sns.boxplot(
    x = df.Global_intensity[df.Global_intensity.notna()], 
    ax = ax[1][0], palette = 'cividis'
)
sns.boxplot(
    x = df.Voltage[df.Voltage.notna()], 
    ax = ax[1][1], palette = 'cividis'
)
sns.histplot(
    x = df.Global_intensity[df.Global_intensity.notna()], bins = 80, 
    element = 'bars', ax = ax[0][0]
)
sns.histplot(
    x = df.Voltage[df.Voltage.notna()], bins = 80, 
    element = 'bars', ax = ax[0][1]
)

fig.suptitle('Distribusi Intensitas Listrik (Kiri) dan Tegangan Listrik (Kanan)', fontsize = 30)
fig.savefig(os.path.join(visdat_path, 'voltage and intensity'))

Hubungan antara Daya Aktif dan Reaktif

In [ ]:
fg = sns.FacetGrid(
    df, row = 'Year', col = 'Month'
)

fg.map(
    sns.scatterplot,'Global_active_power', 'Global_reactive_power',
)
plt.show()
In [ ]:
 

Berapakah rata-rata daya yang digunakan rumah tangga selama 4 tahun per bulan

Konsumsi rumah tangga terhadap daya listrik biasanya memuncak pada awal dan akhir tahun

Terlihat pola seasonal, dimana pada bulan awal dan akhir, rata-rata penggunaan daya listrik menjadi meningkat

In [15]:
data = df.groupby(['Year', 'Month'])[['Global_active_power', 'Global_reactive_power']].mean().reset_index()
data['Month'] = pd.Series(np.tile(month, 5)) + ' ' + data.Year.astype('string')
data = data.drop('Year', axis = 1)

fig, ax = plt.subplots(1,1,figsize = (18,10), dpi = 300)
sns.lineplot(
    x = 'Month',
    y = 'Global_active_power',
    data = data,
    ax = ax,
    marker = 'o',
    markersize = 8,
    linewidth = 1
)

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.set_xticklabels(data.Month.values, rotation = 90, fontsize = 15)
ax.set_ylabel('Global Active Power (KiloWatt)', fontsize = 18)
ax.grid(alpha = 0.4)
fig.suptitle('Rata-rata Penggunaan Daya Aktif, dan Daya Reaktif \nper bulan dari 2006 hingga 2010 ', fontsize = 30)

plt.savefig(os.path.join(visdat_path, 'Active and Reactive Power in time'))

Bagaimana Persebaran Daya Aktif per Bulan dalam tahunan

Data yang terdapat pada tahun 2006 hanya bulan Desember

Daya aktif yang digunakan oleh rumah tangga cenderung beragam di awal tahun dan akhir tahun

Boxenplot memiliki lebar kotak yang cukup besar terutama di awal tahun (Januari) dan akhir tahun (Oktober, November, Desember), ini dapat memberi gambaran bahwa pola konsumtif energi listrik cenderung beragam dibandingkan dengan bulan-bulan lain

In [13]:
fig,ax = plt.subplots(4,1,figsize = (17,24), dpi = 300)
c = ['magma', 'viridis', 'cividis', 'inferno']

for i in range(4):
  sns.boxenplot(
      data = df[df.Year == 2007+i], 
      y = 'Global_active_power', x = df[df.Year == 2007+i].Month.astype('category'), 
      palette = c[i], ax = ax[i]
  )
  ax[i].set_xticklabels(month, fontsize = 14)
  ax[i].set_title(str(2007+i), fontsize = 30)
  ax[i].set_ylabel('Global Active Power', fontsize = 14)

  ax[i].spines['top'].set_visible(False)
  ax[i].spines['bottom'].set_visible(False)
  ax[i].spines['right'].set_visible(False)
  ax[i].spines['left'].set_visible(False)

fig.tight_layout(pad = 4)
fig.savefig(os.path.join(visdat_path, 'Global Active Power per month in all year (Boxenplot)'))

Bagaimana Rata-rata daya aktif per bulan tiap tahunnya

Rata-rata penggunaan daya listrik cenderung menaik di pertengahan tahun

Boxenplot melihat bagaimana persebaran penggunaan daya listrik, namun tidak memperlihatkan tendensi penggunaannya. Setelah diperlihatkan rata-rata penggunaan daya listrik per bulannya, terlihat rumah tangga cenderung sedikit mengonsumsi energi listrik pada pertengahan tahun, seperti pada bulan Juni, Juli, dan Agustus, dan mulai naik pada awal dan akhir tahun

Hal ini bisa jadi karena masyarakat cenderung menggunakan listrik pada musim-musim dingin

In [12]:
data = df.groupby(['Year', 'Month'])[['Global_active_power', 'Global_reactive_power']].mean().reset_index()
month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec']

fig, ax = plt.subplots(1,1,figsize = (15,10), dpi = 300)

data.Month = data.Month.astype('float64')
sns.lineplot(
    y = 'Global_active_power', x = 'Month', data = data[data.Year != 2006], hue = 'Year',
    ax = ax, palette = 'Set1', marker = 'o', markersize = 7
)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.set_xticks(np.arange(1,13))
ax.set_yticks(np.arange(0,1.6, 0.1))
ax.set_xticklabels(month, fontsize = 14)
ax.set_ylabel('Global Active Power', fontsize = 14)
ax.grid(alpha = 0.3)
ax.set_title('Rata-rata Penggunaan daya listrik aktif\nPer bulan tiap tahun', fontsize = 30, pad = 30)
ax.legend(loc = 'lower right', shadow = True, title = 'Year')
fig.savefig(os.path.join(visdat_path, 'Active Power (average)'))

Manakah yang lebih banyak menggunakan daya

Air Conditioner dan Water Heater menjadi alat yang paling tinggi menggunakan daya listrik

Dari rata-rata penggunaan daya listrik oleh beberapa alat rumah tangga, (Kitchen Appliances, Laundry Appliances, Air Conditioner/Water Heater), terlihat AC dan Pemanas Ruangan menjadi alat yang paling tinggi menggunakan daya listrik.

Terlihat rata-rata sebesar kurang lebih 6wattHours yang digunakan untuk AC dan pemanas ruangan, dibandingkan dengan Alat dapur dan Alat Mencuci.

Bisa jadi karena penggunaan AC dan pemanas ruangan lebih sering dibandingkan dengan alat lainnya

Persebaran penggunaan daya listrik oleh Air Conditioner dan Water Heater cukup beragam dibandingkan alat rumah tangga lain

Selain menjadi alat yang menggunakan daya yang tinggi, Persebaran daya listrik untuk Air Conditioner dan Water Heater yang digunakan untuk tiap waktunya cukup beragam.

In [ ]:
data = df.describe()[['Sub_metering_1', 'Sub_metering_2', 'Sub_metering_3']].drop('count')
data.columns = ['Kitchen', 'LaundryRoom', 'AirConditioner']
data
Out[ ]:
Kitchen LaundryRoom AirConditioner
mean 1.121923 1.298520 6.458447
std 6.153031 5.822026 8.437154
min 0.000000 0.000000 0.000000
25% 0.000000 0.000000 0.000000
50% 0.000000 0.000000 1.000000
75% 0.000000 1.000000 17.000000
max 88.000000 80.000000 31.000000
In [23]:
from sklearn.preprocessing import StandardScaler

data = df[['Sub_metering_1', 'Sub_metering_2', 'Sub_metering_3']]
# StandardScaler digunakan untuk melakukan scaling terhadap variabel
ss = StandardScaler()
result = ss.fit_transform(data)

fig,ax = plt.subplots(1,1,figsize = (15,8), dpi = 300)
sns.boxplot(
  data = pd.DataFrame(
      data = result.ravel(),
      index = np.repeat(['Kitchen', 'LaundryRoom', 'AirConditioner'], len(result)),
      columns = ['Watt']
  ).reset_index(), 
  x = 'Watt', 
  y = 'index',
  ax = ax,
  width = 0.6,
  linewidth = 0.2,
  palette = 'viridis'
)
fig.suptitle('Persebaran Daya yang dipakai menurut appliances\nSetelah dilakukan scaling', fontsize = 30)

ax.set_ylabel('Appliance', fontsize = 16)
ax.set_xlabel(None)
ax.tick_params(
    left = False,
    bottom = False,
    labelbottom = False
)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
plt.savefig(os.path.join(visdat_path, 'Appliances distribution (boxplot)'))

Bagaimana Penggunaan daya Listrik pada Pemanas dan Pendingin Ruangan

Air Conditioner dan Water Heater

In [ ]:
fig, ax = plt.subplots(2,1,figsize = (14,18), dpi = 300)
# Boxplot
sns.boxplot(
    data = df,
    y = 'Sub_metering_3',
    x = 'Month',
    ax = ax[0],
    palette = 'plasma'
)
ax[0].set_xticklabels(month)
ax[0].set_ylabel('WattHours')
ax[0].set_title('Persebaran Penggunaan\nAir Conditioner dan Water Heater\nTiap Bulannya', fontsize = (30), pad = 30)
for spine in ['top', 'left','bottom','right']:
  ax[0].spines[spine].set_visible(False)
# Line Plot
data = df.groupby('Month').Sub_metering_3.mean().reset_index().astype('float64')

ax[1].plot(
    data.Month, data.Sub_metering_3, color = plt.get_cmap('inferno')(60),
    marker = 'o'
)
ax[1].set_title(
    'Rata-Rata Penggunaan daya listrik\npada Penghangat dan Pendingin Ruangan\nTiap Bulan', 
    fontsize = 30, pad = 30
)
ax[1].set_ylim(0,8)
ax[1].set_ylabel('WattHours')
ax[1].set_xticks(np.arange(1,13))
ax[1].set_xticklabels(month)
ax[1].grid(zorder = 0)
for spine in ['top', 'left','bottom','right']:
  ax[1].spines[spine].set_visible(False)

fig.tight_layout(pad = 3)
fig.savefig(os.path.join(visdat_path, 'AC and WH per month'))